home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / hplip / plugin.py < prev    next >
Text File  |  2009-10-09  |  15KB  |  445 lines

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. #
  4. # (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
  5. #
  6. # This program is free software; you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation; either version 2 of the License, or
  9. # (at your option) any later version.
  10. #
  11. # This program is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. # GNU General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU General Public License
  17. # along with this program; if not, write to the Free Software
  18. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  19. #
  20. # Author: Don Welch
  21. #
  22.  
  23. __version__ = '2.1'
  24. __mod__ = 'hp-plugin'
  25. __title__ = 'Plugin Download and Install Utility'
  26. __doc__ = ""
  27.  
  28. # Std Lib
  29. import sys
  30. import getopt
  31. import time
  32. import os.path
  33. import re
  34. import os
  35. import gzip
  36.  
  37. # Local
  38. from base.g import *
  39. from base import device, utils, tui, module
  40. from prnt import cups
  41.  
  42. pm = None
  43.  
  44. def plugin_download_callback(c, s, t):
  45.     pm.update(int(100*c*s/t),
  46.              utils.format_bytes(c*s))
  47.  
  48.  
  49. def plugin_install_callback(s):
  50.     print s
  51.  
  52.  
  53.  
  54. USAGE = [ (__doc__, "", "name", True),
  55.           ("Usage: %s [MODE] [OPTIONS]" % __mod__, "", "summary", True),
  56.           utils.USAGE_MODE,
  57.           utils.USAGE_GUI_MODE,
  58.           utils.USAGE_INTERACTIVE_MODE,
  59.           ("Installation for required printer mode:", "--required (Qt4 only)", "option", False),
  60.           ("Installation for optional printer mode:", "--optional (Qt4 only)", "option", False),
  61.           #("Installation generic mode:", "--generic (default)", "option", False),
  62.           utils.USAGE_LANGUAGE,
  63.           utils.USAGE_OPTIONS,
  64.           ("Specify the path to the plugin file:", "-p <path> or --path=<path> or --plugin=<path>", "option", False),
  65.           utils.USAGE_LOGGING1, utils.USAGE_LOGGING2, utils.USAGE_LOGGING3,
  66.           utils.USAGE_HELP,
  67.           utils.USAGE_SPACE,
  68.           utils.USAGE_SEEALSO,
  69.           ("hp-setup", "", "seealso", False),
  70.           ("hp-firmware", "", "seealso", False),
  71.         ]
  72.  
  73.  
  74. mod = module.Module(__mod__, __title__, __version__, __doc__, USAGE,
  75.                     (INTERACTIVE_MODE, GUI_MODE),
  76.                     (UI_TOOLKIT_QT3, UI_TOOLKIT_QT4), True)
  77.  
  78. opts, device_uri, printer_name, mode, ui_toolkit, loc = \
  79.     mod.parseStdOpts('p:', ['path=', 'plugin=', 'plug-in=', 'reason=',
  80.                             'generic', 'optional', 'required'],
  81.                      handle_device_printer=False)
  82.  
  83. plugin_path = None
  84. install_mode = PLUGIN_NONE # reuse plugin types for mode (PLUGIN_NONE = generic)
  85. plugin_reason = PLUGIN_REASON_NONE
  86.  
  87. for o, a in opts:
  88.     if o in ('-p', '--path', '--plugin', '--plug-in'):
  89.         plugin_path = os.path.normpath(os.path.abspath(os.path.expanduser(a)))
  90.  
  91.     elif o == '--required':
  92.         install_mode = PLUGIN_REQUIRED
  93.         if ui_toolkit == 'qt3':
  94.             log.warn("--required switch ignored.")
  95.  
  96.     elif o == '--optional':
  97.         install_mode = PLUGIN_OPTIONAL
  98.         if ui_toolkit == 'qt3':
  99.             log.warn("--optional switch ignored.")
  100.  
  101.     elif o == '--reason':
  102.         plugin_reason = int(a)
  103.  
  104.  
  105. version = prop.installed_version
  106. plugin_filename = 'hplip-%s-plugin.run' % version
  107.  
  108. if plugin_path is not None:
  109.     if not os.path.exists(plugin_path):
  110.         log.error("Plug-in path '%s' not found." % plugin_path)
  111.         sys.exit(1)
  112.  
  113.     if os.path.isdir(plugin_path):
  114.         plugin_path = os.path.join(plugin_path, 'hplip-%s-plugin.run' % version)
  115.  
  116.         if not os.path.exists(plugin_path):
  117.             log.error("Plug-in path '%s' not found." % plugin_path)
  118.             sys.exit(1)
  119.  
  120.     if os.path.basename(plugin_path) != plugin_filename:
  121.         log.error("Plug-in filename must be '%s'." % plugin_filename)
  122.         sys.exit(1)
  123.  
  124.  
  125.     size, checksum, timestamp = os.stat(plugin_path)[6], '', 0.0
  126.     plugin_path = 'file://' + plugin_path
  127.     log.debug("Plugin path=%s (%d)" % (plugin_path, size))
  128.  
  129.  
  130. if mode == GUI_MODE:
  131.     if ui_toolkit == 'qt3':
  132.         if not utils.canEnterGUIMode():
  133.             log.error("%s requires GUI support (try running with --qt4). Try using interactive (-i) mode." % __mod__)
  134.             sys.exit(1)
  135.     else:
  136.         if not utils.canEnterGUIMode4():
  137.             log.error("%s requires GUI support (try running with --qt3). Try using interactive (-i) mode." % __mod__)
  138.             sys.exit(1)
  139.  
  140.  
  141. PKIT = utils.to_bool(sys_conf.get('configure', 'policy-kit'))
  142. if PKIT:
  143.     try:
  144.         from base.pkit import *
  145.         try:
  146.             pkit = PolicyKit()
  147.             pkit_installed = True
  148.         except dbus.DBusException, ex:
  149.             log.error("PolicyKit support requires DBUS or PolicyKit support files missing")
  150.             pkit_installed = False
  151.     except:
  152.         log.error("Unable to load pkit...is HPLIP installed?")
  153.         pkit_installed = False
  154. else:
  155.     pkit_installed = False
  156.  
  157.  
  158. if mode == GUI_MODE:
  159.     if ui_toolkit == 'qt3':
  160.         try:
  161.             from qt import *
  162.             from ui import pluginform2
  163.         except ImportError:
  164.             log.error("Unable to load Qt3 support. Is it installed?")
  165.             sys.exit(1)
  166.  
  167.         app = QApplication(sys.argv)
  168.         QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
  169.  
  170.         if loc is None:
  171.             loc = user_conf.get('ui', 'loc', 'system')
  172.             if loc.lower() == 'system':
  173.                 loc = str(QTextCodec.locale())
  174.                 log.debug("Using system locale: %s" % loc)
  175.  
  176.         if loc.lower() != 'c':
  177.             e = 'utf8'
  178.             try:
  179.                 l, x = loc.split('.')
  180.                 loc = '.'.join([l, e])
  181.             except ValueError:
  182.                 l = loc
  183.                 loc = '.'.join([loc, e])
  184.  
  185.             log.debug("Trying to load .qm file for %s locale." % loc)
  186.             trans = QTranslator(None)
  187.  
  188.             qm_file = 'hplip_%s.qm' % l
  189.             log.debug("Name of .qm file: %s" % qm_file)
  190.             loaded = trans.load(qm_file, prop.localization_dir)
  191.  
  192.             if loaded:
  193.                 app.installTranslator(trans)
  194.             else:
  195.                 loc = 'c'
  196.  
  197.         if loc == 'c':
  198.             log.debug("Using default 'C' locale")
  199.         else:
  200.             log.debug("Using locale: %s" % loc)
  201.             QLocale.setDefault(QLocale(loc))
  202.             prop.locale = loc
  203.             try:
  204.                 locale.setlocale(locale.LC_ALL, locale.normalize(loc))
  205.             except locale.Error:
  206.                 pass
  207.  
  208.         if not pkit_installed and not os.geteuid() == 0:
  209.             log.error("You must be root to run this utility.")
  210.  
  211.             QMessageBox.critical(None,
  212.                                  "HP Device Manager - Plug-in Installer",
  213.                                  "You must be root to run hp-plugin.",
  214.                                   QMessageBox.Ok,
  215.                                   QMessageBox.NoButton,
  216.                                   QMessageBox.NoButton)
  217.  
  218.             sys.exit(1)
  219.  
  220.         w = pluginform2.PluginForm2()
  221.         app.setMainWidget(w)
  222.         w.show()
  223.  
  224.         app.exec_loop()
  225.  
  226.     else: # qt4
  227.         try:
  228.             from PyQt4.QtGui import QApplication, QMessageBox
  229.             from ui4.plugindialog import PluginDialog
  230.         except ImportError:
  231.             log.error("Unable to load Qt4 support. Is it installed?")
  232.             sys.exit(1)
  233.  
  234.         app = QApplication(sys.argv)
  235.  
  236.         if not pkit_installed and not os.geteuid() == 0:
  237.             log.error("You must be root to run this utility.")
  238.  
  239.             QMessageBox.critical(None,
  240.                                  "HP Device Manager - Plug-in Installer",
  241.                                  "You must be root to run hp-plugin.",
  242.                                   QMessageBox.Ok,
  243.                                   QMessageBox.NoButton,
  244.                                   QMessageBox.NoButton)
  245.  
  246.             sys.exit(1)
  247.  
  248.  
  249.         dialog = PluginDialog(None, install_mode, plugin_reason)
  250.         dialog.show()
  251.         try:
  252.             log.debug("Starting GUI loop...")
  253.             app.exec_()
  254.         except KeyboardInterrupt:
  255.             log.error("User exit")
  256.             sys.exit(0)
  257.  
  258.  
  259. else: # INTERACTIVE_MODE
  260.     try:
  261.         if not os.geteuid() == 0:
  262.             log.error("You must be root to run this utility.")
  263.             sys.exit(1)
  264.  
  265.         log.info("(Note: Defaults for each question are maked with a '*'. Press <enter> to accept the default.)")
  266.         log.info("")
  267.  
  268.         from installer import core_install
  269.         core = core_install.CoreInstall()
  270.  
  271.         core.set_plugin_version()
  272.  
  273.         tui.header("PLUG-IN INSTALLATION FOR HPLIP %s" % version)
  274.  
  275.         if core.check_for_plugin() and plugin_path is None:
  276.             log.info("The driver plugin for HPLIP %s appears to already be installed." % version)
  277.  
  278.             cont, ans = tui.enter_yes_no("Do you wish to download and re-install the plug-in?")
  279.  
  280.             if not cont or not ans:
  281.                 sys.exit(0)
  282.  
  283.  
  284.         if plugin_path is None:
  285.             table = tui.Formatter(header=('Option', 'Description'), min_widths=(10, 50))
  286.             table.add(('d', 'Download plug-in from HP (recomended)'))
  287.             table.add(('p', 'Specify a path to the plug-in (advanced)'))
  288.             table.add(('q', 'Quit hp-plugin (skip installation)'))
  289.  
  290.             table.output()
  291.  
  292.             cont, ans = tui.enter_choice("\nEnter option (d=download*, p=specify path, q=quit) ? ",
  293.                 ['d', 'p'], 'd')
  294.  
  295.             if not cont: # q
  296.                 sys.exit(0)
  297.  
  298.  
  299.             if ans == 'd': # d - download
  300.                 # read plugin.conf (local or on sf.net) to get plugin_path (http://)
  301.                 plugin_conf_url = core.get_plugin_conf_url()
  302.  
  303.                 if plugin_conf_url.startswith('file://'):
  304.                     tui.header("COPY CONFIGURATION")
  305.                 else:
  306.                     tui.header("DOWNLOAD CONFIGURATION")
  307.  
  308.                     log.info("Checking for network connection...")
  309.                     ok = core.check_network_connection()
  310.  
  311.                     if not ok:
  312.                         log.error("Network connection not detected.")
  313.                         sys.exit(1)
  314.  
  315.  
  316.                 log.info("Downloading configuration file from: %s" % plugin_conf_url)
  317.                 pm = tui.ProgressMeter("Downloading configuration:")
  318.  
  319.                 plugin_path, size, checksum, timestamp, ok = core.get_plugin_info(plugin_conf_url,
  320.                     plugin_download_callback)
  321.  
  322.                 print
  323.  
  324.                 if not plugin_path.startswith('http://') and not plugin_path.startswith('file://'):
  325.                     plugin_path = 'file://' + plugin_path
  326.  
  327.             else: # p - specify plugin path
  328.  
  329.                 while True:
  330.                     plugin_path = raw_input(log.bold("Enter the path to the 'hplip-%s-plugin.run' file (q=quit) : " %
  331.                         version)).strip()
  332.  
  333.                     if plugin_path.strip().lower() == 'q':
  334.                         sys.exit(1)
  335.  
  336.                     if not plugin_path.startswith('http://'):
  337.                         plugin_path = os.path.normpath(os.path.abspath(os.path.expanduser(plugin_path)))
  338.  
  339.                         if not os.path.exists(plugin_path):
  340.                             log.error("Plug-in path '%s' not found." % plugin_path)
  341.                             continue
  342.  
  343.                         if os.path.isdir(plugin_path):
  344.                             plugin_path = os.path.join(plugin_path, plugin_filename)
  345.  
  346.                             if not os.path.exists(plugin_path):
  347.                                 log.error("Plug-in path '%s' not found." % plugin_path)
  348.                                 continue
  349.  
  350.                         if os.path.basename(plugin_path) != plugin_filename:
  351.                             log.error("Plug-in filename must be '%s'." % plugin_filename)
  352.                             continue
  353.  
  354.                         size, checksum, timestamp = os.stat(plugin_path)[6], '', 0.0
  355.                         plugin_path = 'file://' + plugin_path
  356.  
  357.                     break
  358.  
  359.  
  360.         if plugin_path.startswith('file://'):
  361.             tui.header("COPY PLUGIN")
  362.         else:
  363.             tui.header("DOWNLOAD PLUGIN")
  364.  
  365.             log.info("Checking for network connection...")
  366.             ok = core.check_network_connection()
  367.  
  368.             if not ok:
  369.                 log.error("Network connection not detected.")
  370.                 sys.exit(1)
  371.  
  372.         log.info("Downloading plug-in from: %s" % plugin_path)
  373.         pm = tui.ProgressMeter("Downloading plug-in:")
  374.  
  375.         status, ret = core.download_plugin(plugin_path, size, checksum, timestamp, plugin_download_callback)
  376.         print
  377.  
  378.         if status in (core_install.PLUGIN_INSTALL_ERROR_UNABLE_TO_RECV_KEYS, core_install.PLUGIN_INSTALL_ERROR_DIGITAL_SIG_NOT_FOUND):
  379.             log.error("Digital signature file download failed. Without this file, it is not possible to authenticate and validate the plug-in prior to installation.")
  380.             cont, ans = tui.enter_yes_no("Do you still want to install the plug-in?", 'n')
  381.  
  382.             if not cont or not ans:
  383.                 sys.exit(0)
  384.  
  385.         elif status != core_install.PLUGIN_INSTALL_ERROR_NONE:
  386.  
  387.             if status == core_install.PLUGIN_INSTALL_ERROR_PLUGIN_FILE_NOT_FOUND:
  388.                 desc = "Plug-in file not found (server returned 404 or similar error). Error code: %s" % str(ret)
  389.  
  390.             elif status == core_install.PLUGIN_INSTALL_ERROR_DIGITAL_SIG_BAD:
  391.                 desc = "Plug-in file does not match its digital signature. File may have been corrupted or altered. Error code: %s" % str(ret)
  392.  
  393.             elif status == core_install.PLUGIN_INSTALL_ERROR_PLUGIN_FILE_CHECKSUM_ERROR:
  394.                 desc = "Plug-in file does not match its checksum. File may have been corrupted or altered."
  395.  
  396.             elif status == core_install.PLUGIN_INSTALL_ERROR_NO_NETWORK:
  397.                 desc = "Unable to connect to network to download the plug-in. Please check your network connection and try again."
  398.  
  399.             elif status == core_install.PLUGIN_INSTALL_ERROR_DIRECTORY_ERROR:
  400.                 desc = "Unable to create the plug-in directory. Please check your permissions and try again."
  401.  
  402.             core.delete_plugin()
  403.             log.error(desc)
  404.             sys.exit(1)
  405.  
  406.  
  407.         tui.header("INSTALLING PLUG-IN")
  408.  
  409.         core.run_plugin(mode, plugin_install_callback)
  410.  
  411.         cups_devices = device.getSupportedCUPSDevices(['hp']) #, 'hpfax'])
  412.         #print cups_devices
  413.  
  414.         title = False
  415.  
  416.         for dev in cups_devices:
  417.             mq = device.queryModelByURI(dev)
  418.  
  419.             if mq.get('fw-download', 0):
  420.  
  421.                 if not title:
  422.                     tui.header("DOWNLOADING FIRMWARE")
  423.                     title = True
  424.  
  425.                 # Download firmware if needed
  426.                 log.info(log.bold("\nDownloading firmware to device %s..." % dev))
  427.                 try:
  428.                     d = device.Device(dev)
  429.                 except Error:
  430.                     log.error("Error opening device. Exiting.")
  431.                     sys.exit(1)
  432.  
  433.                 if d.downloadFirmware():
  434.                     log.info("Firmware download successful.\n")
  435.  
  436.                 d.close()
  437.  
  438.  
  439.     except KeyboardInterrupt:
  440.         log.error("User exit")
  441.  
  442. log.info("")
  443. log.info("Done.")
  444.  
  445.